1 module geany_dlang.config;
2 
3 import logger;
4 import std.file;
5 import std.conv;
6 import dyaml;
7 import yamlserialized;
8 
9 @safe:
10 
11 struct Config
12 {
13     bool useCharAddEvent;
14     string[] additionalPaths;
15 }
16 
17 import geany_d_binding.geany.plugindata: GeanyData; 
18 
19 class ConfigFile
20 {
21     private string filepath;
22     Config config;
23 
24     this(in GeanyData* geany_data)
25     {
26         import std.path;
27 
28         string confDir;
29 
30         () @trusted { confDir = geany_data.app.configdir.to!string; }();
31 
32         const dir = buildPath(confDir, "plugins", "dlang_plugin");
33         dir.mkdirRecurse;
34 
35         filepath = buildPath(dir, "dlang_plugin.conf");
36 
37         nothrowLog!"info"("Config file is "~filepath);
38 
39         if(!filepath.exists)
40         {
41             config = Config(); // default config will be used
42 
43             import geany_dlang.dcd_wrapper: DcdWrapper;
44             config.additionalPaths = DcdWrapper.loadConfiguredImportDirs;
45         }
46         else
47         {
48             config = filepath.loadConf;
49         }
50     }
51 
52     ~this()
53     {
54         saveConf();
55     }
56 
57     void saveConf()
58     {
59         import std.stdio: File;
60 
61         auto root = config.toYAMLNode;
62 
63         if(!filepath.exists)
64             filepath.append(""); // creates dirs tree and empty config file
65 
66         auto dumper = dumper();
67         auto file = File(filepath, "w");
68         dumper.dump(file.lockingTextWriter, root);
69         file.flush;
70     }
71 }
72 
73 private Config loadConf(string filename)
74 {
75     ubyte[] buf;
76 
77     () @trusted { buf = cast(ubyte[]) readText(filename); }();
78 
79     Config ret;
80 
81     Loader.fromBuffer(buf).load().deserializeInto(ret);
82 
83     return ret;
84 }